This file is to take the code from DeltaCals_Seasonality_CRD/YF85,
DeltaCalcs_Seasonality_CRD/YF45 to make a panel plot for the seasonal
change and decadal changes
Starting with the CRD
rm(list = ls())
library(ggplot2)
library(ggpubr)
This code is directly from the code files listed above -
.csv files were made at the end of the “DeltaCalcs_Seasonality” files -
those are loaded and used here
Reading in the data files
#2030
MonthlyStatsCRD45_2030 <- read.csv("Corr_MonthlyStatsCRD45_2030.csv")
MonthlyStatsCRD85_2030 <- read.csv("Corr_MonthlyStatsCRD85_2030.csv")
#2060
MonthlyStatsCRD45_2060 <- read.csv("Corr_MonthlyStatsCRD45_2060.csv")
MonthlyStatsCRD85_2060 <- read.csv("Corr_MonthlyStatsCRD85_2060.csv")
#2090
MonthlyStatsCRD45_2090 <- read.csv("Corr_MonthlyStatsCRD45_2090.csv")
MonthlyStatsCRD85_2090 <- read.csv("Corr_MonthlyStatsCRD85_2090.csv")
Creating the plots for 8.5
2030s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsCRD85_2030, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsCRD85_2030$Month <- as.numeric(MonthlyStatsCRD85_2030$Month)
# Plot using ggplot
MonthlyStatsCRD85_2030Plot <- ggplot(data = MonthlyStatsCRD85_2030, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "Delta Water Temperature (°C)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 16),
axis.text = element_text(size = 14))
MonthlyStatsCRD85_2030Plot

2060s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsCRD85_2060, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsCRD85_2060$Month <- as.numeric(MonthlyStatsCRD85_2060$Month)
# Plot using ggplot
MonthlyStatsCRD85_2060Plot <- ggplot(data = MonthlyStatsCRD85_2060, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 16),
axis.text = element_text(size = 14))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsCRD85_2060Plot

2090s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsCRD85_2090, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsCRD85_2090$Month <- as.numeric(MonthlyStatsCRD85_2090$Month)
# Plot using ggplot
MonthlyStatsCRD85_2090Plot <- ggplot(data = MonthlyStatsCRD85_2090, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "") +
theme(axis.title = element_text(size = 16),
axis.text = element_text(size = 14))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsCRD85_2090Plot

Panel Plot
ggarrange(MonthlyStatsCRD85_2030Plot, MonthlyStatsCRD85_2060Plot, MonthlyStatsCRD85_2090Plot, ncol = 3)

Creating the plots for 4.5
2030s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsCRD45_2030, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsCRD45_2030$Month <- as.numeric(MonthlyStatsCRD45_2030$Month)
# Plot using ggplot
MonthlyStatsCRD45_2030Plot <- ggplot(data = MonthlyStatsCRD45_2030, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "Delta Water Temperature (°C)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 16),
axis.text = element_text(size = 14))
MonthlyStatsCRD45_2030Plot

2060s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsCRD45_2060, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsCRD45_2060$Month <- as.numeric(MonthlyStatsCRD45_2060$Month)
# Plot using ggplot
MonthlyStatsCRD45_2060Plot <- ggplot(data = MonthlyStatsCRD45_2060, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 16),
axis.text = element_text(size = 14))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsCRD45_2060Plot

2090s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsCRD45_2090, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsCRD45_2090$Month <- as.numeric(MonthlyStatsCRD45_2090$Month)
# Plot using ggplot
MonthlyStatsCRD45_2090Plot <- ggplot(data = MonthlyStatsCRD45_2090, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "") +
theme(axis.title = element_text(size = 16),
axis.text = element_text(size = 14))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsCRD45_2090Plot

Panel Plot
ggarrange(MonthlyStatsCRD45_2030Plot, MonthlyStatsCRD45_2060Plot, MonthlyStatsCRD45_2090Plot, ncol = 3)

Creating plots with both RCP 4.5 and 8.5
2030s
MonthlyStatsCRD_2030Plot <- ggplot() +
geom_line(data = MonthlyStatsCRD45_2030, aes(x = Month, y = mean_diff_AvgTemp, color = "4.5")) +
geom_line(data = MonthlyStatsCRD85_2030, aes(x = Month, y = mean_diff_AvgTemp, color = "8.5")) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
geom_ribbon(data = MonthlyStatsCRD45_2030, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) +
geom_ribbon(data = MonthlyStatsCRD85_2030, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
ylim(-5, 15) +
theme_classic() +
labs(x = "", y = "Delta Water Temperature (°C)", color = "RCP") + # Setting legend title
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_text(size = 20),
axis.text = element_text(size = 18)) +
scale_color_manual(values = c("4.5" = "blue", "8.5" = "red"), labels = c("4.5", "8.5")) + # Adjusting color scale
theme(legend.position = "none") # Removing the legend
MonthlyStatsCRD_2030Plot

2060s
MonthlyStatsCRD_2060Plot <- ggplot() +
geom_line(data = MonthlyStatsCRD45_2060, aes(x = Month, y = mean_diff_AvgTemp, color = "4.5")) +
geom_line(data = MonthlyStatsCRD85_2060, aes(x = Month, y = mean_diff_AvgTemp, color = "8.5")) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
geom_ribbon(data = MonthlyStatsCRD45_2060, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) +
geom_ribbon(data = MonthlyStatsCRD85_2060, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
ylim(-5, 15) +
theme_classic() +
labs(x = "", y = "", color = "RCP") + # Setting legend title
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank()) +
scale_color_manual(values = c("4.5" = "blue", "8.5" = "red"), labels = c("4.5", "8.5")) + # Adjusting color scale
theme(legend.position = "none") # Removing the legend
MonthlyStatsCRD_2060Plot

2090s
MonthlyStatsCRD_2090Plot <- ggplot() +
geom_line(data = MonthlyStatsCRD45_2090, aes(x = Month, y = mean_diff_AvgTemp, color = "4.5")) +
geom_line(data = MonthlyStatsCRD85_2090, aes(x = Month, y = mean_diff_AvgTemp, color = "8.5")) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
geom_ribbon(data = MonthlyStatsCRD45_2090, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) +
geom_ribbon(data = MonthlyStatsCRD85_2090, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
ylim(-5, 15) +
theme_classic() +
labs(x = "", y = "", color = "RCP") + #setting the legend title
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())+
scale_color_manual(values = c("4.5" = "blue", "8.5" = "red"), labels = c("4.5", "8.5")) + # Adjusting color scale
theme(legend.position = "none") # Removing the legend
MonthlyStatsCRD_2090Plot

Panel Plot
MonthlyStatsCRD <- ggarrange(MonthlyStatsCRD_2030Plot, MonthlyStatsCRD_2060Plot, MonthlyStatsCRD_2090Plot, ncol = 3)
MonthlyStatsCRD
ggsave("Corr_DeltaMonthCRD.png", plot = MonthlyStatsCRD, width = 12, height = 3)

Moving on to YF
This code is directly from the code files listed above -
.csv files were made at the end of the “DeltaCalcs_Seasonality” files -
those are loaded and used here
Reading in the data files
#2030
MonthlyStatsYF45_2030 <- read.csv("Corr_MonthlyStatsYF45_2030.csv")
MonthlyStatsYF85_2030 <- read.csv("Corr_MonthlyStatsYF85_2030.csv")
#2060
MonthlyStatsYF45_2060 <- read.csv("Corr_MonthlyStatsYF45_2060.csv")
MonthlyStatsYF85_2060 <- read.csv("Corr_MonthlyStatsYF85_2060.csv")
#2090
MonthlyStatsYF45_2090 <- read.csv("Corr_MonthlyStatsYF45_2090.csv")
MonthlyStatsYF85_2090 <- read.csv("Corr_MonthlyStatsYF85_2090.csv")
Creating the plots for 8.5
2030s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsYF85_2030, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsYF85_2030$Month <- as.numeric(MonthlyStatsYF85_2030$Month)
# Plot using ggplot
MonthlyStatsYF85_2030Plot <- ggplot(data = MonthlyStatsYF85_2030, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "Delta Water Temperature (°C)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))
MonthlyStatsYF85_2030Plot

2060s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsYF85_2060, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsYF85_2060$Month <- as.numeric(MonthlyStatsYF85_2060$Month)
# Plot using ggplot
MonthlyStatsYF85_2060Plot <- ggplot(data = MonthlyStatsYF85_2060, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsYF85_2060Plot

2090s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsYF85_2090, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsYF85_2090$Month <- as.numeric(MonthlyStatsYF85_2090$Month)
# Plot using ggplot
MonthlyStatsYF85_2090Plot <- ggplot(data = MonthlyStatsYF85_2090, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "") +
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsYF85_2090Plot

Panel Plot
ggarrange(MonthlyStatsYF85_2030Plot, MonthlyStatsYF85_2060Plot, MonthlyStatsYF85_2090Plot, ncol = 3)

Creating the plots for 4.5
2030s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsYF45_2030, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsYF45_2030$Month <- as.numeric(MonthlyStatsYF45_2030$Month)
# Plot using ggplot
MonthlyStatsYF45_2030Plot <- ggplot(data = MonthlyStatsYF45_2030, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "Delta Water Temperature (°C)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))
MonthlyStatsYF45_2030Plot

2060s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsYF45_2060, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsYF45_2060$Month <- as.numeric(MonthlyStatsYF45_2060$Month)
# Plot using ggplot
MonthlyStatsYF45_2060Plot <- ggplot(data = MonthlyStatsYF45_2060, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
labs(x = "", y = "") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsYF45_2060Plot

2090s
# 2. Monthly averages across ponds
ggplot(data = MonthlyStatsYF45_2090, aes(x = Month)) +
geom_point(aes(y = mean_diff_AvgTemp)) +
theme_classic()

# Convert Month from character to numeric to ensure proper ordering in ggplot
MonthlyStatsYF45_2090$Month <- as.numeric(MonthlyStatsYF45_2090$Month)
# Plot using ggplot
MonthlyStatsYF45_2090Plot <- ggplot(data = MonthlyStatsYF45_2090, aes(x = Month)) +
geom_line(aes(y = mean_diff_AvgTemp)) + # Point plot with mean values
geom_hline(yintercept = 0, linetype = "dashed", color = "black") + # Horizontal dashed line at y = 0
geom_ribbon(aes(ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) + # Ribbon for positive and negative error based on sd values
scale_x_continuous(breaks = 1:12, labels = month.abb) + # Adjust x-axis labels to show month abbreviations
ylim(-5,15)+
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(x = "", y = "") +
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())
MonthlyStatsYF45_2090Plot

Panel Plot
ggarrange(MonthlyStatsYF45_2030Plot, MonthlyStatsYF45_2060Plot, MonthlyStatsYF45_2090Plot, ncol = 3)

Creating plots with both RCP 4.5 and 8.5
2030s
MonthlyStatsYF_2030Plot <- ggplot() +
geom_line(data = MonthlyStatsYF45_2030, aes(x = Month, y = mean_diff_AvgTemp, color = "4.5")) +
geom_line(data = MonthlyStatsYF85_2030, aes(x = Month, y = mean_diff_AvgTemp, color = "8.5")) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
geom_ribbon(data = MonthlyStatsYF45_2030, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) +
geom_ribbon(data = MonthlyStatsYF85_2030, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
ylim(-5, 15) +
theme_classic() +
labs(x = "", y = "Delta Water Temperature (°C)", color = "RCP") + # Setting legend title
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_text(size = 20),
axis.text = element_text(size = 18)) +
scale_color_manual(values = c("4.5" = "blue", "8.5" = "red"), labels = c("4.5", "8.5")) + # Adjusting color scale
theme(legend.position = "none") # Removing the legend
MonthlyStatsYF_2030Plot

2060s
MonthlyStatsYF_2060Plot <- ggplot() +
geom_line(data = MonthlyStatsYF45_2060, aes(x = Month, y = mean_diff_AvgTemp, color = "4.5")) +
geom_line(data = MonthlyStatsYF85_2060, aes(x = Month, y = mean_diff_AvgTemp, color = "8.5")) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
geom_ribbon(data = MonthlyStatsYF45_2060, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) +
geom_ribbon(data = MonthlyStatsYF85_2060, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
ylim(-5, 15) +
theme_classic() +
labs(x = "", y = "", color = "RCP") + # Setting legend title
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank()) +
scale_color_manual(values = c("4.5" = "blue", "8.5" = "red"), labels = c("4.5", "8.5")) + # Adjusting color scale
theme(legend.position = "none") # Removing the legend
MonthlyStatsYF_2060Plot

2090s
MonthlyStatsYF_2090Plot <- ggplot() +
geom_line(data = MonthlyStatsYF45_2090, aes(x = Month, y = mean_diff_AvgTemp, color = "4.5")) +
geom_line(data = MonthlyStatsYF85_2090, aes(x = Month, y = mean_diff_AvgTemp, color = "8.5")) +
geom_hline(yintercept = 0, linetype = "dashed", color = "black") +
geom_ribbon(data = MonthlyStatsYF45_2090, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "blue", alpha = 0.3) +
geom_ribbon(data = MonthlyStatsYF85_2090, aes(x = Month, ymin = mean_diff_AvgTemp - sd_diff_AvgTemp, ymax = mean_diff_AvgTemp + sd_diff_AvgTemp), fill = "red", alpha = 0.3) +
scale_x_continuous(breaks = 1:12, labels = month.abb) +
ylim(-5, 15) +
theme_classic() +
labs(x = "", y = "", color = "RCP") + #setting the legend title
theme(axis.title = element_text(size = 20),
axis.text = element_text(size = 18))+
theme(axis.text.x = element_text(angle = 45, hjust = 1),
axis.text.y = element_blank(), # Remove Y-axis tick mark labels
axis.ticks.y = element_blank())+
scale_color_manual(values = c("4.5" = "blue", "8.5" = "red"), labels = c("4.5", "8.5")) + # Adjusting color scale
theme(legend.position = "none") # Removing the legend
MonthlyStatsYF_2090Plot

Panel Plot
# Combine plots into a panel with one legend
library(ggpubr)
MonthlyStatsYF <- ggarrange(
MonthlyStatsYF_2030Plot,
MonthlyStatsYF_2060Plot,
MonthlyStatsYF_2090Plot,
ncol = 3,
common.legend = TRUE, # Ensure common legend
legend = "bottom" # Position the legend to the right of the panel
)
# Save the combined plo
ggsave("Corr_DeltaMonthYF.png", plot = MonthlyStatsYF, width = 12, height = 4)
Creating one giant panel plot
library(ggplot2)
library(ggpubr)
# Define a function to remove the legend
remove_legend <- function(plot) {
plot + theme(legend.position = "none")
}
# Modify the MonthlyStatsYF_2060Plot with a customized legend title and position
MonthlyStatsYF_2060PlotWithLegend <- MonthlyStatsYF_2060Plot +
guides(color = guide_legend(
title = NULL,
override.aes = list(size = 2) # Increase the line size in the legend
)) +
theme(
legend.position = c(0.95, 0.98), # Adjust x and y coordinates for position (farther up)
legend.justification = c(1, 1), # Adjust justification to position the legend correctly
legend.text = element_text(size = 24) # Increase the legend text size (3 times the default size)
)
# Combine all plots
combined_plot <- ggarrange(
remove_legend(MonthlyStatsCRD_2030Plot),
remove_legend(MonthlyStatsCRD_2060Plot),
remove_legend(MonthlyStatsCRD_2090Plot),
remove_legend(MonthlyStatsYF_2030Plot),
MonthlyStatsYF_2060PlotWithLegend, # Plot with the legend
remove_legend(MonthlyStatsYF_2090Plot),
ncol = 3, nrow = 2,
common.legend = FALSE
)
combined_plot
# Save the combined plot
ggsave("Corr_DeltaMonth_Combined.png", combined_plot, width = 15, height = 10)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBmaWxlIGlzIHRvIHRha2UgdGhlIGNvZGUgZnJvbSBEZWx0YUNhbHNfU2Vhc29uYWxpdHlfQ1JEL1lGODUsIERlbHRhQ2FsY3NfU2Vhc29uYWxpdHlfQ1JEL1lGNDUgdG8gbWFrZSBhIHBhbmVsIHBsb3QgZm9yIHRoZSBzZWFzb25hbCBjaGFuZ2UgYW5kIGRlY2FkYWwgY2hhbmdlcwoKIyMjIFN0YXJ0aW5nIHdpdGggdGhlIENSRAoKYGBge3J9CgpybShsaXN0ID0gbHMoKSkKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3B1YnIpCmBgYAoKVGhpcyBjb2RlIGlzICpkaXJlY3RseSBmcm9tIHRoZSBjb2RlIGZpbGVzIGxpc3RlZCBhYm92ZSoKLSAuY3N2IGZpbGVzIHdlcmUgbWFkZSBhdCB0aGUgZW5kIG9mIHRoZSAiRGVsdGFDYWxjc19TZWFzb25hbGl0eSIgZmlsZXMKLSB0aG9zZSBhcmUgbG9hZGVkIGFuZCB1c2VkIGhlcmUKICAKIyBSZWFkaW5nIGluIHRoZSBkYXRhIGZpbGVzCgpgYGB7cn0KIzIwMzAKTW9udGhseVN0YXRzQ1JENDVfMjAzMCA8LSByZWFkLmNzdigiQ29ycl9Nb250aGx5U3RhdHNDUkQ0NV8yMDMwLmNzdiIpIApNb250aGx5U3RhdHNDUkQ4NV8yMDMwIDwtIHJlYWQuY3N2KCJDb3JyX01vbnRobHlTdGF0c0NSRDg1XzIwMzAuY3N2IikgCgojMjA2MApNb250aGx5U3RhdHNDUkQ0NV8yMDYwIDwtIHJlYWQuY3N2KCJDb3JyX01vbnRobHlTdGF0c0NSRDQ1XzIwNjAuY3N2IikgCk1vbnRobHlTdGF0c0NSRDg1XzIwNjAgPC0gcmVhZC5jc3YoIkNvcnJfTW9udGhseVN0YXRzQ1JEODVfMjA2MC5jc3YiKSAKCiMyMDkwCk1vbnRobHlTdGF0c0NSRDQ1XzIwOTAgPC0gcmVhZC5jc3YoIkNvcnJfTW9udGhseVN0YXRzQ1JENDVfMjA5MC5jc3YiKSAKTW9udGhseVN0YXRzQ1JEODVfMjA5MCA8LSByZWFkLmNzdigiQ29ycl9Nb250aGx5U3RhdHNDUkQ4NV8yMDkwLmNzdiIpIAoKYGBgCgojIENyZWF0aW5nIHRoZSBwbG90cyBmb3IgOC41CjIwMzBzCmBgYHtyfQojIDIuIE1vbnRobHkgYXZlcmFnZXMgYWNyb3NzIHBvbmRzCmdncGxvdChkYXRhID0gTW9udGhseVN0YXRzQ1JEODVfMjAzMCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvbnZlcnQgTW9udGggZnJvbSBjaGFyYWN0ZXIgdG8gbnVtZXJpYyB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nIGluIGdncGxvdApNb250aGx5U3RhdHNDUkQ4NV8yMDMwJE1vbnRoIDwtIGFzLm51bWVyaWMoTW9udGhseVN0YXRzQ1JEODVfMjAzMCRNb250aCkKCiMgUGxvdCB1c2luZyBnZ3Bsb3QKTW9udGhseVN0YXRzQ1JEODVfMjAzMFBsb3QgPC0gZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNDUkQ4NV8yMDMwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fbGluZShhZXMoeSA9IG1lYW5fZGlmZl9BdmdUZW1wKSkgKyAgIyBQb2ludCBwbG90IHdpdGggbWVhbiB2YWx1ZXMKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsgICMgSG9yaXpvbnRhbCBkYXNoZWQgbGluZSBhdCB5ID0gMAogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjMpICsgICMgUmliYm9uIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZXJyb3IgYmFzZWQgb24gc2QgdmFsdWVzCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKyAgIyBBZGp1c3QgeC1heGlzIGxhYmVscyB0byBzaG93IG1vbnRoIGFiYnJldmlhdGlvbnMKICB5bGltKC01LDE1KSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIkRlbHRhIFdhdGVyIFRlbXBlcmF0dXJlICjCsEMpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpCk1vbnRobHlTdGF0c0NSRDg1XzIwMzBQbG90CmBgYAoKMjA2MHMKYGBge3J9CiMgMi4gTW9udGhseSBhdmVyYWdlcyBhY3Jvc3MgcG9uZHMKZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNDUkQ4NV8yMDYwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ29udmVydCBNb250aCBmcm9tIGNoYXJhY3RlciB0byBudW1lcmljIHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmcgaW4gZ2dwbG90Ck1vbnRobHlTdGF0c0NSRDg1XzIwNjAkTW9udGggPC0gYXMubnVtZXJpYyhNb250aGx5U3RhdHNDUkQ4NV8yMDYwJE1vbnRoKQoKIyBQbG90IHVzaW5nIGdncGxvdApNb250aGx5U3RhdHNDUkQ4NV8yMDYwUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c0NSRDg1XzIwNjAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArICAjIFBvaW50IHBsb3Qgd2l0aCBtZWFuIHZhbHVlcwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyAgIyBIb3Jpem9udGFsIGRhc2hlZCBsaW5lIGF0IHkgPSAwCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuMykgKyAgIyBSaWJib24gZm9yIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBlcnJvciBiYXNlZCBvbiBzZCB2YWx1ZXMKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMiwgbGFiZWxzID0gbW9udGguYWJiKSArICAjIEFkanVzdCB4LWF4aXMgbGFiZWxzIHRvIHNob3cgbW9udGggYWJicmV2aWF0aW9ucwogIHlsaW0oLTUsMTUpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAgIyBSZW1vdmUgWS1heGlzIHRpY2sgbWFyayBsYWJlbHMKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCk1vbnRobHlTdGF0c0NSRDg1XzIwNjBQbG90CmBgYAoKMjA5MHMKYGBge3J9CiMgMi4gTW9udGhseSBhdmVyYWdlcyBhY3Jvc3MgcG9uZHMKZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNDUkQ4NV8yMDkwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ29udmVydCBNb250aCBmcm9tIGNoYXJhY3RlciB0byBudW1lcmljIHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmcgaW4gZ2dwbG90Ck1vbnRobHlTdGF0c0NSRDg1XzIwOTAkTW9udGggPC0gYXMubnVtZXJpYyhNb250aGx5U3RhdHNDUkQ4NV8yMDkwJE1vbnRoKQoKIyBQbG90IHVzaW5nIGdncGxvdApNb250aGx5U3RhdHNDUkQ4NV8yMDkwUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c0NSRDg1XzIwOTAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArICAjIFBvaW50IHBsb3Qgd2l0aCBtZWFuIHZhbHVlcwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyAgIyBIb3Jpem9udGFsIGRhc2hlZCBsaW5lIGF0IHkgPSAwCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuMykgKyAgIyBSaWJib24gZm9yIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBlcnJvciBiYXNlZCBvbiBzZCB2YWx1ZXMKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMiwgbGFiZWxzID0gbW9udGguYWJiKSArICAjIEFkanVzdCB4LWF4aXMgbGFiZWxzIHRvIHNob3cgbW9udGggYWJicmV2aWF0aW9ucwogIHlsaW0oLTUsMTUpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAgIyBSZW1vdmUgWS1heGlzIHRpY2sgbWFyayBsYWJlbHMKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCk1vbnRobHlTdGF0c0NSRDg1XzIwOTBQbG90CmBgYAoKUGFuZWwgUGxvdApgYGB7cn0KZ2dhcnJhbmdlKE1vbnRobHlTdGF0c0NSRDg1XzIwMzBQbG90LCBNb250aGx5U3RhdHNDUkQ4NV8yMDYwUGxvdCwgTW9udGhseVN0YXRzQ1JEODVfMjA5MFBsb3QsIG5jb2wgPSAzKQpgYGAKCiMgQ3JlYXRpbmcgdGhlIHBsb3RzIGZvciA0LjUKCjIwMzBzCmBgYHtyfQojIDIuIE1vbnRobHkgYXZlcmFnZXMgYWNyb3NzIHBvbmRzCmdncGxvdChkYXRhID0gTW9udGhseVN0YXRzQ1JENDVfMjAzMCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvbnZlcnQgTW9udGggZnJvbSBjaGFyYWN0ZXIgdG8gbnVtZXJpYyB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nIGluIGdncGxvdApNb250aGx5U3RhdHNDUkQ0NV8yMDMwJE1vbnRoIDwtIGFzLm51bWVyaWMoTW9udGhseVN0YXRzQ1JENDVfMjAzMCRNb250aCkKCiMgUGxvdCB1c2luZyBnZ3Bsb3QKTW9udGhseVN0YXRzQ1JENDVfMjAzMFBsb3QgPC0gZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNDUkQ0NV8yMDMwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fbGluZShhZXMoeSA9IG1lYW5fZGlmZl9BdmdUZW1wKSkgKyAgIyBQb2ludCBwbG90IHdpdGggbWVhbiB2YWx1ZXMKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsgICMgSG9yaXpvbnRhbCBkYXNoZWQgbGluZSBhdCB5ID0gMAogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4zKSArICAjIFJpYmJvbiBmb3IgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGVycm9yIGJhc2VkIG9uIHNkIHZhbHVlcwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbHMgdG8gc2hvdyBtb250aCBhYmJyZXZpYXRpb25zCiAgeWxpbSgtNSwxNSkrCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIiwgeSA9ICJEZWx0YSBXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpKQpNb250aGx5U3RhdHNDUkQ0NV8yMDMwUGxvdApgYGAKCjIwNjBzCmBgYHtyfQojIDIuIE1vbnRobHkgYXZlcmFnZXMgYWNyb3NzIHBvbmRzCmdncGxvdChkYXRhID0gTW9udGhseVN0YXRzQ1JENDVfMjA2MCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvbnZlcnQgTW9udGggZnJvbSBjaGFyYWN0ZXIgdG8gbnVtZXJpYyB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nIGluIGdncGxvdApNb250aGx5U3RhdHNDUkQ0NV8yMDYwJE1vbnRoIDwtIGFzLm51bWVyaWMoTW9udGhseVN0YXRzQ1JENDVfMjA2MCRNb250aCkKCiMgUGxvdCB1c2luZyBnZ3Bsb3QKTW9udGhseVN0YXRzQ1JENDVfMjA2MFBsb3QgPC0gZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNDUkQ0NV8yMDYwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fbGluZShhZXMoeSA9IG1lYW5fZGlmZl9BdmdUZW1wKSkgKyAgIyBQb2ludCBwbG90IHdpdGggbWVhbiB2YWx1ZXMKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsgICMgSG9yaXpvbnRhbCBkYXNoZWQgbGluZSBhdCB5ID0gMAogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4zKSArICAjIFJpYmJvbiBmb3IgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGVycm9yIGJhc2VkIG9uIHNkIHZhbHVlcwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbHMgdG8gc2hvdyBtb250aCBhYmJyZXZpYXRpb25zCiAgeWxpbSgtNSwxNSkrCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIiwgeSA9ICIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBZLWF4aXMgdGljayBtYXJrIGxhYmVscwogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKTW9udGhseVN0YXRzQ1JENDVfMjA2MFBsb3QKYGBgCgoyMDkwcwpgYGB7cn0KIyAyLiBNb250aGx5IGF2ZXJhZ2VzIGFjcm9zcyBwb25kcwpnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c0NSRDQ1XzIwOTAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IG1lYW5fZGlmZl9BdmdUZW1wKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDb252ZXJ0IE1vbnRoIGZyb20gY2hhcmFjdGVyIHRvIG51bWVyaWMgdG8gZW5zdXJlIHByb3BlciBvcmRlcmluZyBpbiBnZ3Bsb3QKTW9udGhseVN0YXRzQ1JENDVfMjA5MCRNb250aCA8LSBhcy5udW1lcmljKE1vbnRobHlTdGF0c0NSRDQ1XzIwOTAkTW9udGgpCgojIFBsb3QgdXNpbmcgZ2dwbG90Ck1vbnRobHlTdGF0c0NSRDQ1XzIwOTBQbG90IDwtIGdncGxvdChkYXRhID0gTW9udGhseVN0YXRzQ1JENDVfMjA5MCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsgICMgUG9pbnQgcGxvdCB3aXRoIG1lYW4gdmFsdWVzCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArICAjIEhvcml6b250YWwgZGFzaGVkIGxpbmUgYXQgeSA9IDAKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1lYW5fZGlmZl9BdmdUZW1wIC0gc2RfZGlmZl9BdmdUZW1wLCB5bWF4ID0gbWVhbl9kaWZmX0F2Z1RlbXAgKyBzZF9kaWZmX0F2Z1RlbXApLCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuMykgKyAgIyBSaWJib24gZm9yIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBlcnJvciBiYXNlZCBvbiBzZCB2YWx1ZXMKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMiwgbGFiZWxzID0gbW9udGguYWJiKSArICAjIEFkanVzdCB4LWF4aXMgbGFiZWxzIHRvIHNob3cgbW9udGggYWJicmV2aWF0aW9ucwogIHlsaW0oLTUsMTUpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCkpKwogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAgIyBSZW1vdmUgWS1heGlzIHRpY2sgbWFyayBsYWJlbHMKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpCk1vbnRobHlTdGF0c0NSRDQ1XzIwOTBQbG90CmBgYAoKUGFuZWwgUGxvdApgYGB7cn0KZ2dhcnJhbmdlKE1vbnRobHlTdGF0c0NSRDQ1XzIwMzBQbG90LCBNb250aGx5U3RhdHNDUkQ0NV8yMDYwUGxvdCwgTW9udGhseVN0YXRzQ1JENDVfMjA5MFBsb3QsIG5jb2wgPSAzKQpgYGAKCiMgQ3JlYXRpbmcgcGxvdHMgd2l0aCBib3RoIFJDUCA0LjUgYW5kIDguNQoKMjAzMHMKYGBge3J9Ck1vbnRobHlTdGF0c0NSRF8yMDMwUGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNDUkQ0NV8yMDMwLCBhZXMoeCA9IE1vbnRoLCB5ID0gbWVhbl9kaWZmX0F2Z1RlbXAsIGNvbG9yID0gIjQuNSIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNDUkQ4NV8yMDMwLCBhZXMoeCA9IE1vbnRoLCB5ID0gbWVhbl9kaWZmX0F2Z1RlbXAsIGNvbG9yID0gIjguNSIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9yaWJib24oZGF0YSA9IE1vbnRobHlTdGF0c0NSRDQ1XzIwMzAsIGFlcyh4ID0gTW9udGgsIHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3JpYmJvbihkYXRhID0gTW9udGhseVN0YXRzQ1JEODVfMjAzMCwgYWVzKHggPSBNb250aCwgeW1pbiA9IG1lYW5fZGlmZl9BdmdUZW1wIC0gc2RfZGlmZl9BdmdUZW1wLCB5bWF4ID0gbWVhbl9kaWZmX0F2Z1RlbXAgKyBzZF9kaWZmX0F2Z1RlbXApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4zKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKwogIHlsaW0oLTUsIDE1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIiwgeSA9ICJEZWx0YSBXYXRlciBUZW1wZXJhdHVyZSAowrBDKSIsIGNvbG9yID0gIlJDUCIpICsgICMgU2V0dGluZyBsZWdlbmQgdGl0bGUKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCI0LjUiID0gImJsdWUiLCAiOC41IiA9ICJyZWQiKSwgbGFiZWxzID0gYygiNC41IiwgIjguNSIpKSArICAjIEFkanVzdGluZyBjb2xvciBzY2FsZQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgICMgUmVtb3ZpbmcgdGhlIGxlZ2VuZAoKTW9udGhseVN0YXRzQ1JEXzIwMzBQbG90CmBgYAoKMjA2MHMKYGBge3J9Ck1vbnRobHlTdGF0c0NSRF8yMDYwUGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNDUkQ0NV8yMDYwLCBhZXMoeCA9IE1vbnRoLCB5ID0gbWVhbl9kaWZmX0F2Z1RlbXAsIGNvbG9yID0gIjQuNSIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNDUkQ4NV8yMDYwLCBhZXMoeCA9IE1vbnRoLCB5ID0gbWVhbl9kaWZmX0F2Z1RlbXAsIGNvbG9yID0gIjguNSIpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9yaWJib24oZGF0YSA9IE1vbnRobHlTdGF0c0NSRDQ1XzIwNjAsIGFlcyh4ID0gTW9udGgsIHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3JpYmJvbihkYXRhID0gTW9udGhseVN0YXRzQ1JEODVfMjA2MCwgYWVzKHggPSBNb250aCwgeW1pbiA9IG1lYW5fZGlmZl9BdmdUZW1wIC0gc2RfZGlmZl9BdmdUZW1wLCB5bWF4ID0gbWVhbl9kaWZmX0F2Z1RlbXAgKyBzZF9kaWZmX0F2Z1RlbXApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4zKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKwogIHlsaW0oLTUsIDE1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCBjb2xvciA9ICJSQ1AiKSArICMgU2V0dGluZyBsZWdlbmQgdGl0bGUKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBZLWF4aXMgdGljayBtYXJrIGxhYmVscwogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCI0LjUiID0gImJsdWUiLCAiOC41IiA9ICJyZWQiKSwgbGFiZWxzID0gYygiNC41IiwgIjguNSIpKSArICMgQWRqdXN0aW5nIGNvbG9yIHNjYWxlICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICAjIFJlbW92aW5nIHRoZSBsZWdlbmQKCk1vbnRobHlTdGF0c0NSRF8yMDYwUGxvdApgYGAKCjIwOTBzCmBgYHtyfQpNb250aGx5U3RhdHNDUkRfMjA5MFBsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gTW9udGhseVN0YXRzQ1JENDVfMjA5MCwgYWVzKHggPSBNb250aCwgeSA9IG1lYW5fZGlmZl9BdmdUZW1wLCBjb2xvciA9ICI0LjUiKSkgKwogIGdlb21fbGluZShkYXRhID0gTW9udGhseVN0YXRzQ1JEODVfMjA5MCwgYWVzKHggPSBNb250aCwgeSA9IG1lYW5fZGlmZl9BdmdUZW1wLCBjb2xvciA9ICI4LjUiKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fcmliYm9uKGRhdGEgPSBNb250aGx5U3RhdHNDUkQ0NV8yMDkwLCBhZXMoeCA9IE1vbnRoLCB5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9yaWJib24oZGF0YSA9IE1vbnRobHlTdGF0c0NSRDg1XzIwOTAsIGFlcyh4ID0gTW9udGgsIHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuMykgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsKICB5bGltKC01LCAxNSkgKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiIiwgY29sb3IgPSAiUkNQIikgKyAjc2V0dGluZyB0aGUgbGVnZW5kIHRpdGxlCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAgIyBSZW1vdmUgWS1heGlzIHRpY2sgbWFyayBsYWJlbHMKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCI0LjUiID0gImJsdWUiLCAiOC41IiA9ICJyZWQiKSwgbGFiZWxzID0gYygiNC41IiwgIjguNSIpKSArICMgQWRqdXN0aW5nIGNvbG9yIHNjYWxlICAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICAjIFJlbW92aW5nIHRoZSBsZWdlbmQKCk1vbnRobHlTdGF0c0NSRF8yMDkwUGxvdApgYGAKClBhbmVsIFBsb3QKYGBge3J9Ck1vbnRobHlTdGF0c0NSRCA8LSBnZ2FycmFuZ2UoTW9udGhseVN0YXRzQ1JEXzIwMzBQbG90LCBNb250aGx5U3RhdHNDUkRfMjA2MFBsb3QsIE1vbnRobHlTdGF0c0NSRF8yMDkwUGxvdCwgbmNvbCA9IDMpCk1vbnRobHlTdGF0c0NSRApnZ3NhdmUoIkNvcnJfRGVsdGFNb250aENSRC5wbmciLCBwbG90ID0gTW9udGhseVN0YXRzQ1JELCB3aWR0aCA9IDEyLCBoZWlnaHQgPSAzKQpgYGAKCiMjIyBNb3Zpbmcgb24gdG8gWUYKClRoaXMgY29kZSBpcyAqZGlyZWN0bHkgZnJvbSB0aGUgY29kZSBmaWxlcyBsaXN0ZWQgYWJvdmUqCi0gLmNzdiBmaWxlcyB3ZXJlIG1hZGUgYXQgdGhlIGVuZCBvZiB0aGUgIkRlbHRhQ2FsY3NfU2Vhc29uYWxpdHkiIGZpbGVzCi0gdGhvc2UgYXJlIGxvYWRlZCBhbmQgdXNlZCBoZXJlCiAgCiMgUmVhZGluZyBpbiB0aGUgZGF0YSBmaWxlcwoKYGBge3J9CiMyMDMwCk1vbnRobHlTdGF0c1lGNDVfMjAzMCA8LSByZWFkLmNzdigiQ29ycl9Nb250aGx5U3RhdHNZRjQ1XzIwMzAuY3N2IikgCk1vbnRobHlTdGF0c1lGODVfMjAzMCA8LSByZWFkLmNzdigiQ29ycl9Nb250aGx5U3RhdHNZRjg1XzIwMzAuY3N2IikgCgojMjA2MApNb250aGx5U3RhdHNZRjQ1XzIwNjAgPC0gcmVhZC5jc3YoIkNvcnJfTW9udGhseVN0YXRzWUY0NV8yMDYwLmNzdiIpIApNb250aGx5U3RhdHNZRjg1XzIwNjAgPC0gcmVhZC5jc3YoIkNvcnJfTW9udGhseVN0YXRzWUY4NV8yMDYwLmNzdiIpIAoKIzIwOTAKTW9udGhseVN0YXRzWUY0NV8yMDkwIDwtIHJlYWQuY3N2KCJDb3JyX01vbnRobHlTdGF0c1lGNDVfMjA5MC5jc3YiKSAKTW9udGhseVN0YXRzWUY4NV8yMDkwIDwtIHJlYWQuY3N2KCJDb3JyX01vbnRobHlTdGF0c1lGODVfMjA5MC5jc3YiKSAKCmBgYAoKIyBDcmVhdGluZyB0aGUgcGxvdHMgZm9yIDguNQoyMDMwcwpgYGB7cn0KIyAyLiBNb250aGx5IGF2ZXJhZ2VzIGFjcm9zcyBwb25kcwpnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c1lGODVfMjAzMCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvbnZlcnQgTW9udGggZnJvbSBjaGFyYWN0ZXIgdG8gbnVtZXJpYyB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nIGluIGdncGxvdApNb250aGx5U3RhdHNZRjg1XzIwMzAkTW9udGggPC0gYXMubnVtZXJpYyhNb250aGx5U3RhdHNZRjg1XzIwMzAkTW9udGgpCgojIFBsb3QgdXNpbmcgZ2dwbG90Ck1vbnRobHlTdGF0c1lGODVfMjAzMFBsb3QgPC0gZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNZRjg1XzIwMzAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArICAjIFBvaW50IHBsb3Qgd2l0aCBtZWFuIHZhbHVlcwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyAgIyBIb3Jpem9udGFsIGRhc2hlZCBsaW5lIGF0IHkgPSAwCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJyZWQiLCBhbHBoYSA9IDAuMykgKyAgIyBSaWJib24gZm9yIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBlcnJvciBiYXNlZCBvbiBzZCB2YWx1ZXMKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMiwgbGFiZWxzID0gbW9udGguYWJiKSArICAjIEFkanVzdCB4LWF4aXMgbGFiZWxzIHRvIHNob3cgbW9udGggYWJicmV2aWF0aW9ucwogIHlsaW0oLTUsMTUpKwogIHRoZW1lX2NsYXNzaWMoKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiRGVsdGEgV2F0ZXIgVGVtcGVyYXR1cmUgKMKwQykiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkKTW9udGhseVN0YXRzWUY4NV8yMDMwUGxvdApgYGAKCjIwNjBzCmBgYHtyfQojIDIuIE1vbnRobHkgYXZlcmFnZXMgYWNyb3NzIHBvbmRzCmdncGxvdChkYXRhID0gTW9udGhseVN0YXRzWUY4NV8yMDYwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ29udmVydCBNb250aCBmcm9tIGNoYXJhY3RlciB0byBudW1lcmljIHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmcgaW4gZ2dwbG90Ck1vbnRobHlTdGF0c1lGODVfMjA2MCRNb250aCA8LSBhcy5udW1lcmljKE1vbnRobHlTdGF0c1lGODVfMjA2MCRNb250aCkKCiMgUGxvdCB1c2luZyBnZ3Bsb3QKTW9udGhseVN0YXRzWUY4NV8yMDYwUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c1lGODVfMjA2MCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsgICMgUG9pbnQgcGxvdCB3aXRoIG1lYW4gdmFsdWVzCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArICAjIEhvcml6b250YWwgZGFzaGVkIGxpbmUgYXQgeSA9IDAKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1lYW5fZGlmZl9BdmdUZW1wIC0gc2RfZGlmZl9BdmdUZW1wLCB5bWF4ID0gbWVhbl9kaWZmX0F2Z1RlbXAgKyBzZF9kaWZmX0F2Z1RlbXApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4zKSArICAjIFJpYmJvbiBmb3IgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGVycm9yIGJhc2VkIG9uIHNkIHZhbHVlcwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbHMgdG8gc2hvdyBtb250aCBhYmJyZXZpYXRpb25zCiAgeWxpbSgtNSwxNSkrCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIiwgeSA9ICIiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBZLWF4aXMgdGljayBtYXJrIGxhYmVscwogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKTW9udGhseVN0YXRzWUY4NV8yMDYwUGxvdApgYGAKCjIwOTBzCmBgYHtyfQojIDIuIE1vbnRobHkgYXZlcmFnZXMgYWNyb3NzIHBvbmRzCmdncGxvdChkYXRhID0gTW9udGhseVN0YXRzWUY4NV8yMDkwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fcG9pbnQoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsKICB0aGVtZV9jbGFzc2ljKCkKCiMgQ29udmVydCBNb250aCBmcm9tIGNoYXJhY3RlciB0byBudW1lcmljIHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJpbmcgaW4gZ2dwbG90Ck1vbnRobHlTdGF0c1lGODVfMjA5MCRNb250aCA8LSBhcy5udW1lcmljKE1vbnRobHlTdGF0c1lGODVfMjA5MCRNb250aCkKCiMgUGxvdCB1c2luZyBnZ3Bsb3QKTW9udGhseVN0YXRzWUY4NV8yMDkwUGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c1lGODVfMjA5MCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBtZWFuX2RpZmZfQXZnVGVtcCkpICsgICMgUG9pbnQgcGxvdCB3aXRoIG1lYW4gdmFsdWVzCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArICAjIEhvcml6b250YWwgZGFzaGVkIGxpbmUgYXQgeSA9IDAKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IG1lYW5fZGlmZl9BdmdUZW1wIC0gc2RfZGlmZl9BdmdUZW1wLCB5bWF4ID0gbWVhbl9kaWZmX0F2Z1RlbXAgKyBzZF9kaWZmX0F2Z1RlbXApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4zKSArICAjIFJpYmJvbiBmb3IgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGVycm9yIGJhc2VkIG9uIHNkIHZhbHVlcwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbHMgdG8gc2hvdyBtb250aCBhYmJyZXZpYXRpb25zCiAgeWxpbSgtNSwxNSkrCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBZLWF4aXMgdGljayBtYXJrIGxhYmVscwogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKTW9udGhseVN0YXRzWUY4NV8yMDkwUGxvdApgYGAKClBhbmVsIFBsb3QKYGBge3J9CmdnYXJyYW5nZShNb250aGx5U3RhdHNZRjg1XzIwMzBQbG90LCBNb250aGx5U3RhdHNZRjg1XzIwNjBQbG90LCBNb250aGx5U3RhdHNZRjg1XzIwOTBQbG90LCBuY29sID0gMykKYGBgCgojIENyZWF0aW5nIHRoZSBwbG90cyBmb3IgNC41CgoyMDMwcwpgYGB7cn0KIyAyLiBNb250aGx5IGF2ZXJhZ2VzIGFjcm9zcyBwb25kcwpnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c1lGNDVfMjAzMCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvbnZlcnQgTW9udGggZnJvbSBjaGFyYWN0ZXIgdG8gbnVtZXJpYyB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nIGluIGdncGxvdApNb250aGx5U3RhdHNZRjQ1XzIwMzAkTW9udGggPC0gYXMubnVtZXJpYyhNb250aGx5U3RhdHNZRjQ1XzIwMzAkTW9udGgpCgojIFBsb3QgdXNpbmcgZ2dwbG90Ck1vbnRobHlTdGF0c1lGNDVfMjAzMFBsb3QgPC0gZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwMzAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArICAjIFBvaW50IHBsb3Qgd2l0aCBtZWFuIHZhbHVlcwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyAgIyBIb3Jpem9udGFsIGRhc2hlZCBsaW5lIGF0IHkgPSAwCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjMpICsgICMgUmliYm9uIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZXJyb3IgYmFzZWQgb24gc2QgdmFsdWVzCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKyAgIyBBZGp1c3QgeC1heGlzIGxhYmVscyB0byBzaG93IG1vbnRoIGFiYnJldmlhdGlvbnMKICB5bGltKC01LDE1KSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIkRlbHRhIFdhdGVyIFRlbXBlcmF0dXJlICjCsEMpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpCk1vbnRobHlTdGF0c1lGNDVfMjAzMFBsb3QKYGBgCgoyMDYwcwpgYGB7cn0KIyAyLiBNb250aGx5IGF2ZXJhZ2VzIGFjcm9zcyBwb25kcwpnZ3Bsb3QoZGF0YSA9IE1vbnRobHlTdGF0c1lGNDVfMjA2MCwgYWVzKHggPSBNb250aCkpICsKICBnZW9tX3BvaW50KGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArCiAgdGhlbWVfY2xhc3NpYygpCgojIENvbnZlcnQgTW9udGggZnJvbSBjaGFyYWN0ZXIgdG8gbnVtZXJpYyB0byBlbnN1cmUgcHJvcGVyIG9yZGVyaW5nIGluIGdncGxvdApNb250aGx5U3RhdHNZRjQ1XzIwNjAkTW9udGggPC0gYXMubnVtZXJpYyhNb250aGx5U3RhdHNZRjQ1XzIwNjAkTW9udGgpCgojIFBsb3QgdXNpbmcgZ2dwbG90Ck1vbnRobHlTdGF0c1lGNDVfMjA2MFBsb3QgPC0gZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwNjAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gbWVhbl9kaWZmX0F2Z1RlbXApKSArICAjIFBvaW50IHBsb3Qgd2l0aCBtZWFuIHZhbHVlcwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKyAgIyBIb3Jpem9udGFsIGRhc2hlZCBsaW5lIGF0IHkgPSAwCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjMpICsgICMgUmliYm9uIGZvciBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZXJyb3IgYmFzZWQgb24gc2QgdmFsdWVzCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKyAgIyBBZGp1c3QgeC1heGlzIGxhYmVscyB0byBzaG93IG1vbnRoIGFiYnJldmlhdGlvbnMKICB5bGltKC01LDE1KSsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKSsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgICMgUmVtb3ZlIFktYXhpcyB0aWNrIG1hcmsgbGFiZWxzCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKQpNb250aGx5U3RhdHNZRjQ1XzIwNjBQbG90CmBgYAoKMjA5MHMKYGBge3J9CiMgMi4gTW9udGhseSBhdmVyYWdlcyBhY3Jvc3MgcG9uZHMKZ2dwbG90KGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwOTAsIGFlcyh4ID0gTW9udGgpKSArCiAgZ2VvbV9wb2ludChhZXMoeSA9IG1lYW5fZGlmZl9BdmdUZW1wKSkgKwogIHRoZW1lX2NsYXNzaWMoKQoKIyBDb252ZXJ0IE1vbnRoIGZyb20gY2hhcmFjdGVyIHRvIG51bWVyaWMgdG8gZW5zdXJlIHByb3BlciBvcmRlcmluZyBpbiBnZ3Bsb3QKTW9udGhseVN0YXRzWUY0NV8yMDkwJE1vbnRoIDwtIGFzLm51bWVyaWMoTW9udGhseVN0YXRzWUY0NV8yMDkwJE1vbnRoKQoKIyBQbG90IHVzaW5nIGdncGxvdApNb250aGx5U3RhdHNZRjQ1XzIwOTBQbG90IDwtIGdncGxvdChkYXRhID0gTW9udGhseVN0YXRzWUY0NV8yMDkwLCBhZXMoeCA9IE1vbnRoKSkgKwogIGdlb21fbGluZShhZXMoeSA9IG1lYW5fZGlmZl9BdmdUZW1wKSkgKyAgIyBQb2ludCBwbG90IHdpdGggbWVhbiB2YWx1ZXMKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsgICMgSG9yaXpvbnRhbCBkYXNoZWQgbGluZSBhdCB5ID0gMAogIGdlb21fcmliYm9uKGFlcyh5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4zKSArICAjIFJpYmJvbiBmb3IgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGVycm9yIGJhc2VkIG9uIHNkIHZhbHVlcwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEyLCBsYWJlbHMgPSBtb250aC5hYmIpICsgICMgQWRqdXN0IHgtYXhpcyBsYWJlbHMgdG8gc2hvdyBtb250aCBhYmJyZXZpYXRpb25zCiAgeWxpbSgtNSwxNSkrCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSkrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBZLWF4aXMgdGljayBtYXJrIGxhYmVscwogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkKTW9udGhseVN0YXRzWUY0NV8yMDkwUGxvdApgYGAKClBhbmVsIFBsb3QKYGBge3J9CmdnYXJyYW5nZShNb250aGx5U3RhdHNZRjQ1XzIwMzBQbG90LCBNb250aGx5U3RhdHNZRjQ1XzIwNjBQbG90LCBNb250aGx5U3RhdHNZRjQ1XzIwOTBQbG90LCBuY29sID0gMykKYGBgCgojIENyZWF0aW5nIHBsb3RzIHdpdGggYm90aCBSQ1AgNC41IGFuZCA4LjUKCjIwMzBzCmBgYHtyfQpNb250aGx5U3RhdHNZRl8yMDMwUGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwMzAsIGFlcyh4ID0gTW9udGgsIHkgPSBtZWFuX2RpZmZfQXZnVGVtcCwgY29sb3IgPSAiNC41IikpICsKICBnZW9tX2xpbmUoZGF0YSA9IE1vbnRobHlTdGF0c1lGODVfMjAzMCwgYWVzKHggPSBNb250aCwgeSA9IG1lYW5fZGlmZl9BdmdUZW1wLCBjb2xvciA9ICI4LjUiKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fcmliYm9uKGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwMzAsIGFlcyh4ID0gTW9udGgsIHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3JpYmJvbihkYXRhID0gTW9udGhseVN0YXRzWUY4NV8yMDMwLCBhZXMoeCA9IE1vbnRoLCB5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjMpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMiwgbGFiZWxzID0gbW9udGguYWJiKSArCiAgeWxpbSgtNSwgMTUpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIkRlbHRhIFdhdGVyIFRlbXBlcmF0dXJlICjCsEMpIiwgY29sb3IgPSAiUkNQIikgKyAgIyBTZXR0aW5nIGxlZ2VuZCB0aXRsZQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjQuNSIgPSAiYmx1ZSIsICI4LjUiID0gInJlZCIpLCBsYWJlbHMgPSBjKCI0LjUiLCAiOC41IikpICsgICMgQWRqdXN0aW5nIGNvbG9yIHNjYWxlCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSAgIyBSZW1vdmluZyB0aGUgbGVnZW5kCgpNb250aGx5U3RhdHNZRl8yMDMwUGxvdApgYGAKCjIwNjBzCmBgYHtyfQpNb250aGx5U3RhdHNZRl8yMDYwUGxvdCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwNjAsIGFlcyh4ID0gTW9udGgsIHkgPSBtZWFuX2RpZmZfQXZnVGVtcCwgY29sb3IgPSAiNC41IikpICsKICBnZW9tX2xpbmUoZGF0YSA9IE1vbnRobHlTdGF0c1lGODVfMjA2MCwgYWVzKHggPSBNb250aCwgeSA9IG1lYW5fZGlmZl9BdmdUZW1wLCBjb2xvciA9ICI4LjUiKSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKwogIGdlb21fcmliYm9uKGRhdGEgPSBNb250aGx5U3RhdHNZRjQ1XzIwNjAsIGFlcyh4ID0gTW9udGgsIHltaW4gPSBtZWFuX2RpZmZfQXZnVGVtcCAtIHNkX2RpZmZfQXZnVGVtcCwgeW1heCA9IG1lYW5fZGlmZl9BdmdUZW1wICsgc2RfZGlmZl9BdmdUZW1wKSwgZmlsbCA9ICJibHVlIiwgYWxwaGEgPSAwLjMpICsKICBnZW9tX3JpYmJvbihkYXRhID0gTW9udGhseVN0YXRzWUY4NV8yMDYwLCBhZXMoeCA9IE1vbnRoLCB5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjMpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMiwgbGFiZWxzID0gbW9udGguYWJiKSArCiAgeWxpbSgtNSwgMTUpICsKICB0aGVtZV9jbGFzc2ljKCkgKwogIGxhYnMoeCA9ICIiLCB5ID0gIiIsIGNvbG9yID0gIlJDUCIpICsgIyBTZXR0aW5nIGxlZ2VuZCB0aXRsZQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpKSsKICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwgICMgUmVtb3ZlIFktYXhpcyB0aWNrIG1hcmsgbGFiZWxzCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjQuNSIgPSAiYmx1ZSIsICI4LjUiID0gInJlZCIpLCBsYWJlbHMgPSBjKCI0LjUiLCAiOC41IikpICsgIyBBZGp1c3RpbmcgY29sb3Igc2NhbGUgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgICMgUmVtb3ZpbmcgdGhlIGxlZ2VuZAoKTW9udGhseVN0YXRzWUZfMjA2MFBsb3QKYGBgCgoyMDkwcwpgYGB7cn0KTW9udGhseVN0YXRzWUZfMjA5MFBsb3QgPC0gZ2dwbG90KCkgKwogIGdlb21fbGluZShkYXRhID0gTW9udGhseVN0YXRzWUY0NV8yMDkwLCBhZXMoeCA9IE1vbnRoLCB5ID0gbWVhbl9kaWZmX0F2Z1RlbXAsIGNvbG9yID0gIjQuNSIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBNb250aGx5U3RhdHNZRjg1XzIwOTAsIGFlcyh4ID0gTW9udGgsIHkgPSBtZWFuX2RpZmZfQXZnVGVtcCwgY29sb3IgPSAiOC41IikpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3JpYmJvbihkYXRhID0gTW9udGhseVN0YXRzWUY0NV8yMDkwLCBhZXMoeCA9IE1vbnRoLCB5bWluID0gbWVhbl9kaWZmX0F2Z1RlbXAgLSBzZF9kaWZmX0F2Z1RlbXAsIHltYXggPSBtZWFuX2RpZmZfQXZnVGVtcCArIHNkX2RpZmZfQXZnVGVtcCksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9yaWJib24oZGF0YSA9IE1vbnRobHlTdGF0c1lGODVfMjA5MCwgYWVzKHggPSBNb250aCwgeW1pbiA9IG1lYW5fZGlmZl9BdmdUZW1wIC0gc2RfZGlmZl9BdmdUZW1wLCB5bWF4ID0gbWVhbl9kaWZmX0F2Z1RlbXAgKyBzZF9kaWZmX0F2Z1RlbXApLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC4zKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTIsIGxhYmVscyA9IG1vbnRoLmFiYikgKwogIHlsaW0oLTUsIDE1KSArCiAgdGhlbWVfY2xhc3NpYygpICsKICBsYWJzKHggPSAiIiwgeSA9ICIiLCBjb2xvciA9ICJSQ1AiKSArICNzZXR0aW5nIHRoZSBsZWdlbmQgdGl0bGUKICB0aGVtZShheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCkpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksICAjIFJlbW92ZSBZLWF4aXMgdGljayBtYXJrIGxhYmVscwogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIjQuNSIgPSAiYmx1ZSIsICI4LjUiID0gInJlZCIpLCBsYWJlbHMgPSBjKCI0LjUiLCAiOC41IikpICsgIyBBZGp1c3RpbmcgY29sb3Igc2NhbGUgIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgICMgUmVtb3ZpbmcgdGhlIGxlZ2VuZAoKTW9udGhseVN0YXRzWUZfMjA5MFBsb3QKYGBgCgpQYW5lbCBQbG90CmBgYHtyfQojIENvbWJpbmUgcGxvdHMgaW50byBhIHBhbmVsIHdpdGggb25lIGxlZ2VuZApsaWJyYXJ5KGdncHVicikKTW9udGhseVN0YXRzWUYgPC0gZ2dhcnJhbmdlKAogIE1vbnRobHlTdGF0c1lGXzIwMzBQbG90LAogIE1vbnRobHlTdGF0c1lGXzIwNjBQbG90LAogIE1vbnRobHlTdGF0c1lGXzIwOTBQbG90LAogIG5jb2wgPSAzLAogIGNvbW1vbi5sZWdlbmQgPSBUUlVFLCAgIyBFbnN1cmUgY29tbW9uIGxlZ2VuZAogIGxlZ2VuZCA9ICJib3R0b20iICAjIFBvc2l0aW9uIHRoZSBsZWdlbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYW5lbAopCgojIFNhdmUgdGhlIGNvbWJpbmVkIHBsbwpnZ3NhdmUoIkNvcnJfRGVsdGFNb250aFlGLnBuZyIsIHBsb3QgPSBNb250aGx5U3RhdHNZRiwgd2lkdGggPSAxMiwgaGVpZ2h0ID0gNCkKCmBgYAoKQ3JlYXRpbmcgb25lIGdpYW50IHBhbmVsIHBsb3QKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQoKIyBEZWZpbmUgYSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxlZ2VuZApyZW1vdmVfbGVnZW5kIDwtIGZ1bmN0aW9uKHBsb3QpIHsKICBwbG90ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQp9CgojIE1vZGlmeSB0aGUgTW9udGhseVN0YXRzWUZfMjA2MFBsb3Qgd2l0aCBhIGN1c3RvbWl6ZWQgbGVnZW5kIHRpdGxlIGFuZCBwb3NpdGlvbgpNb250aGx5U3RhdHNZRl8yMDYwUGxvdFdpdGhMZWdlbmQgPC0gTW9udGhseVN0YXRzWUZfMjA2MFBsb3QgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZCgKICAgIHRpdGxlID0gTlVMTCwKICAgIG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDIpICMgSW5jcmVhc2UgdGhlIGxpbmUgc2l6ZSBpbiB0aGUgbGVnZW5kCiAgKSkgKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjk1LCAwLjk4KSwgIyBBZGp1c3QgeCBhbmQgeSBjb29yZGluYXRlcyBmb3IgcG9zaXRpb24gKGZhcnRoZXIgdXApCiAgICBsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksICMgQWRqdXN0IGp1c3RpZmljYXRpb24gdG8gcG9zaXRpb24gdGhlIGxlZ2VuZCBjb3JyZWN0bHkKICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCkgIyBJbmNyZWFzZSB0aGUgbGVnZW5kIHRleHQgc2l6ZSAoMyB0aW1lcyB0aGUgZGVmYXVsdCBzaXplKQogICkKIyBDb21iaW5lIGFsbCBwbG90cwpjb21iaW5lZF9wbG90IDwtIGdnYXJyYW5nZSgKICByZW1vdmVfbGVnZW5kKE1vbnRobHlTdGF0c0NSRF8yMDMwUGxvdCksCiAgcmVtb3ZlX2xlZ2VuZChNb250aGx5U3RhdHNDUkRfMjA2MFBsb3QpLAogIHJlbW92ZV9sZWdlbmQoTW9udGhseVN0YXRzQ1JEXzIwOTBQbG90KSwKICByZW1vdmVfbGVnZW5kKE1vbnRobHlTdGF0c1lGXzIwMzBQbG90KSwKICBNb250aGx5U3RhdHNZRl8yMDYwUGxvdFdpdGhMZWdlbmQsICMgUGxvdCB3aXRoIHRoZSBsZWdlbmQKICByZW1vdmVfbGVnZW5kKE1vbnRobHlTdGF0c1lGXzIwOTBQbG90KSwKICBuY29sID0gMywgbnJvdyA9IDIsCiAgY29tbW9uLmxlZ2VuZCA9IEZBTFNFCikKCmNvbWJpbmVkX3Bsb3QKCiMgU2F2ZSB0aGUgY29tYmluZWQgcGxvdApnZ3NhdmUoIkNvcnJfRGVsdGFNb250aF9Db21iaW5lZC5wbmciLCBjb21iaW5lZF9wbG90LCB3aWR0aCA9IDE1LCBoZWlnaHQgPSAxMCkKCmBgYA==